package algorithm;

import java.util.List;
import java.util.ArrayList;
import java.util.Random;

// 抢红包算法实现
public class GrabRedBag {
    //红包功能需要满足哪些具体规则呢?
    //1、所有人抢到的金额之和要等于红包金额，不能多也不能少
    //2、每个人至少抢到1分钱
    //3、要保证红包拆分的金额尽可能分布均衡，不要出现两极分化太严重的情况
    // 分配红包 返回列表代表金额
    // 二倍均值法
    // 假设剩余红包金额为m元，剩余人数为n，那么有如下公式：
    // 每次抢到的金额 = 随机区间 [0.01, m / n × 2 - 0.01]元
    // 保证每次随机金额平均值相等 m 为剩余金额 n为人数时 m/n就是平均值 m / n * 2 - 0.01为上边界
    public static List<Integer> divideRedPackage(Integer totalAmount, Integer totalPeopleNum) {
        List<Integer> amountList = new ArrayList<Integer>();
        Integer restAmount = totalAmount;
        Integer restPeopleNum = totalPeopleNum;
        Random random = new Random();
        for (int i = 0; i < totalPeopleNum - 1; i++) {
            //随机范围：[1，剩余人均金额的2倍-1] 分
            int amount = random.nextInt(restAmount / restPeopleNum * 2 - 1) + 1;
            restAmount = restAmount - amount;
            restPeopleNum--;
            amountList.add(amount);
        }
        amountList.add(restAmount);

        return amountList;
    }
}
